#include <EEPROM.h>
/////////////////////////////////////////////////////PRO CAS/////////////////////////////////////////////////////////////////////////////////
int Rok=2012;
int Dny=0;
int Hodiny=0;
int Minuty=0;
int Vteriny=0;
int VterinyPomocne=0;
unsigned long long millis2=0;
unsigned long DobaPoplachu=0;
char Jsem[]="MEGA";
/////////////////////////////////////////////////////PRO KOMUNIKACI/////////////////////////////////////////////////////////////////////////////////
char Pocitachistor[]="OCITACHISTOR";
char Nahrejcas[]="OCITACNAHCAS";
char Poslicas[]="OCITACPOSCAS";
char nahrejeeprom[]="OCITACNAHREJ";
char hesloz[]="OCITACHESLOZ";
char hesloz2[]="OCITACHESLO2";
char hesloz3[]="OCITACHESLO3";
char hesloz4[]="OCITACHESLO4";
char zastrez[]="OCITACHLIDAT";//CITACHLIDAT
char eeprom[]="OCITACEEPROM";
char eepro2[]="OCITACEEPRO2";
char alarmm[]="OCITACALARMM";
char odezva[]="OCITACODEZVA";//musi byt min znaku
char odezv2[]="OCITACODEZV2";//musi byt min znaku
char okkkkk[]="OCITACOKKKKK";
char kdojsi[]="OCITACKDOJSI";
char chybaa[]="OCITACCHYBAA";
char zjisti[]="OCITACZJISTI";
char vymazh[]="OCITACVYMAZH";

char koneckom[]="KONECKOM";
/////////////////////////////////////////////////////NASTAVENI CASU/////////////////////////////////////////////////////////////////////////////////
class NastavCas{
public:void Cas(int hodiny,int minuty,int vteriny)
{VterinyPomocne=vteriny;
Hodiny=hodiny;Minuty=minuty;Vteriny=vteriny;}
public:void Cas()//1
{
  if(VterinyPomocne!=0){
  Vteriny=VterinyPomocne+(millis()-millis2)/1000;
}
  else Vteriny=(millis()-millis2)/1000;
  if(Vteriny>59){
    VterinyPomocne=0;
  millis2=millis();
Minuty++;
  }
 if(Minuty>59){
Hodiny++;Minuty=0;}
if(Hodiny>23){
Dny++;   

 int qqqq= Dny;
                    if(qqqq>=300){
                      EEPROM.write(997,3);
                        qqqq-=300;
                        EEPROM.write(998,qqqq);
                    }else if(qqqq>=200){
                  EEPROM.write(997,2);
                        qqqq-=200;
                        EEPROM.write(998,qqqq);
                    }else if(qqqq>=100){
                   EEPROM.write(997,1);
                        qqqq-=100;
                        EEPROM.write(998,qqqq);
                    }else{
                 EEPROM.write(997,0);
                      
                        EEPROM.write(998,qqqq);
                    }



Hodiny=0;}

if(Dny==365){
if(Rok%4!=0){
Dny=0;Rok++;EEPROM.write(999,Rok);}}
if(Dny==366){
Dny=0;Rok++;EEPROM.write(999,Rok);}
}};
NastavCas Cas;


struct Analog_Ovladani{
int Snimat;
int Minimum;
int Maximum;
int Casova_Aktivace;
};Analog_Ovladani Analog_Ovladani[16];

struct Digital_Ovladani{
int Snimat;
int Vstup_Nastaveni;
int Vystup_Nastaveni;
int Casova_Aktivace;
};Digital_Ovladani Digital_Ovladani[52];


struct Casova_Aktivace{
int Hodina_Aktivace;
int Minuta_Aktivace;
int Vterina_Aktivace;
int Hodina_Deaktivace;
int Minuta_Deaktivace;
int Vterina_Deaktivace;
int Minuta_Odchod;
int Vterina_Odchod;
int Minuta_Prichod;
int Vterina_Prichod;
int Aktiv_Zmena_Na;
int Pwm;
int Doba_Stavu2;
int Vystupy[16];
};Casova_Aktivace Casova_Aktivace[12];

struct Ostatni{
int DobaOpetovneReakce;
int Hlidani_Pc[4];
int Eeprom_Heslo[6];
int Heslo_Zastrez1[27];
int Heslo_Zastrez2[27];
int Heslo_Zastrez3[27];
int Heslo_Zastrez4[27];
};Ostatni Ostatni;


struct Eeprom{    
////////////////////////////////////////////////////////// NAHRANI Z EEPROM //////////////////////////////////////////////////////

public:void Nahrej_Z_Pameti(){
int Hlidani;
int Hodnota;
int i=0;
int w=0;
int q=0;
   /*for (int i = 0; i < 1000; i++)
    EEPROM.write(i, 0);*/
///////////NAHRANI Z PAMETI DO ANALOG struktury
i=1;
for(Hlidani=0;Hlidani<16;Hlidani++){
Hodnota = EEPROM.read(i);
Analog_Ovladani[Hlidani].Snimat=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Analog_Ovladani[Hlidani].Minimum=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Analog_Ovladani[Hlidani].Maximum=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Analog_Ovladani[Hlidani].Casova_Aktivace=Hodnota;
i++;
  }
  
////////////NAHRANI Z PAMETI DO Digit_Pin_Ovladani_02_54
i=101;
Hlidani=0;
Hodnota=0;
for(Hlidani=0;Hlidani<52;Hlidani++){
Hodnota = EEPROM.read(i);
Digital_Ovladani[Hlidani].Snimat=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Digital_Ovladani[Hlidani].Vstup_Nastaveni=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Digital_Ovladani[Hlidani].Vystup_Nastaveni=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Digital_Ovladani[Hlidani].Casova_Aktivace=Hodnota;
i++;
  }
                     
////////////NAHRANI Z PAMETI DO Casova_Aktivace
i=401;
Hlidani=0;
Hodnota=0;
for(Hlidani=0;Hlidani<12;Hlidani++){
  Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Hodina_Aktivace=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Minuta_Aktivace=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Vterina_Aktivace=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Hodina_Deaktivace=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Minuta_Deaktivace=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Vterina_Deaktivace=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Minuta_Odchod=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Vterina_Odchod=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Minuta_Prichod=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Vterina_Prichod=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Aktiv_Zmena_Na=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Pwm=Hodnota;
i++;
Hodnota = EEPROM.read(i);
Casova_Aktivace[Hlidani].Doba_Stavu2=Hodnota;
i++;
Hodnota = EEPROM.read(i);
for(int Hlidani2=0;Hlidani2<16;Hlidani2++){
Casova_Aktivace[Hlidani].Vystupy[Hlidani2]=Hodnota;
i++;
Hodnota = EEPROM.read(i);
} }


   ///////////////OSTATNI/////////////
   i=801;
   Hodnota = EEPROM.read(i);
 Ostatni.DobaOpetovneReakce=Hodnota;
i++;


Hodnota = EEPROM.read(i);
 Ostatni.Hlidani_Pc[0]=Hodnota;
i++;

Hodnota = EEPROM.read(i);
 Ostatni.Hlidani_Pc[1]=Hodnota;
i++;

Hodnota = EEPROM.read(i);
 Ostatni.Hlidani_Pc[2]=Hodnota;
i++;

Hodnota = EEPROM.read(i);
 Ostatni.Hlidani_Pc[3]=Hodnota;
i++;
i=811;

Hodnota = EEPROM.read(i);
for(int q=0;q<6;q++){
 Ostatni.Eeprom_Heslo[q]=Hodnota;
i++;
Hodnota = EEPROM.read(i);}
i=821;
Hodnota = EEPROM.read(i);
for(int q=0;q<27;q++){
 Ostatni.Heslo_Zastrez1[q]=Hodnota;
i++;
if(q==5){q++;i=831;}
Hodnota = EEPROM.read(i);}
i=851;
Hodnota = EEPROM.read(i);
for(int q=0;q<27;q++){
 Ostatni.Heslo_Zastrez2[q]=Hodnota;
i++;if(q==5){q++;i=861;}
Hodnota = EEPROM.read(i);}
i=881;
Hodnota = EEPROM.read(i);
for(int q=0;q<27;q++){
 Ostatni.Heslo_Zastrez3[q]=Hodnota;
i++;if(q==5){q++;i=891;}
Hodnota = EEPROM.read(i);}
i=911;
Hodnota = EEPROM.read(i);
for(int q=0;q<27;q++){
 Ostatni.Heslo_Zastrez4[q]=Hodnota;
i++;if(q==5){q++;i=921;}
Hodnota = EEPROM.read(i);}



 int dny1=(int)EEPROM.read(997);

    int dny2=(int)EEPROM.read(998);

     
    if(dny1==3){
    Dny=dny2+300;
    }else if(dny1==2){
    Dny=dny2+200;
    }else if(dny1==1){
    Dny=dny2+100;
    }else Dny=dny2;
    

int den1=EEPROM.read(997);
int den2=EEPROM.read(998);

Dny=100*den1+den2;



Rok=EEPROM.read(999);

   

   ///////////////////////////////////////////////KONEC VYPISU////////////////////
   ///////////////////////////NACHRANI NECEHO DO PAMETI////////////////
}
void kontrola2(){
  //nahrati do nezastrezeno
  EEPROM.write(827,0);
  EEPROM.write(857,0);
  EEPROM.write(887,0);
  EEPROM.write(917,0);
  
  
Ostatni.Heslo_Zastrez1[6]=0;
Ostatni.Heslo_Zastrez2[6]=0;
Ostatni.Heslo_Zastrez3[6]=0;
Ostatni.Heslo_Zastrez4[6]=0;

EEPROM.write(821,(byte)'1');
EEPROM.write(822,(byte)'1');
EEPROM.write(823,(byte)'1');
EEPROM.write(824,(byte)'1');
EEPROM.write(825,(byte)'1');
EEPROM.write(826,(byte)'1');

EEPROM.write(851,(byte)'2');
EEPROM.write(852,(byte)'2');
EEPROM.write(853,(byte)'2');
EEPROM.write(854,(byte)'2');
EEPROM.write(855,(byte)'2');
EEPROM.write(856,(byte)'2');


EEPROM.write(881,(byte)'3');
EEPROM.write(882,(byte)'3');
EEPROM.write(883,(byte)'3');
EEPROM.write(884,(byte)'3');
EEPROM.write(885,(byte)'3');
EEPROM.write(886,(byte)'3');

EEPROM.write(911,(byte)'4');
EEPROM.write(912,(byte)'4');
EEPROM.write(913,(byte)'4');
EEPROM.write(914,(byte)'4');
EEPROM.write(915,(byte)'4');
EEPROM.write(916,(byte)'4');
Ostatni.Eeprom_Heslo[0]=(byte)'0';
Ostatni.Eeprom_Heslo[1]=(byte)'0';
Ostatni.Eeprom_Heslo[2]=(byte)'0';
Ostatni.Eeprom_Heslo[3]=(byte)'0';
Ostatni.Eeprom_Heslo[4]=(byte)'0';
Ostatni.Eeprom_Heslo[5]=(byte)'0';
EEPROM.write(811,(byte)'0');
EEPROM.write(812,(byte)'0');
EEPROM.write(813,(byte)'0');
EEPROM.write(814,(byte)'0');
EEPROM.write(815,(byte)'0');
EEPROM.write(816,(byte)'0');


}};
Eeprom ArduinoEeprom;




////////////////////////////////////////////// 2 Kontrola analogovych vstupu ////////////////////////////////////////////////
class Analog_Kontrola{

int analoghodnota;
unsigned long AnalogPrichodovyCas[16];
int AnalogPrichodovyCas2[16];
unsigned long AnalogOdchodovyCas[16];
int AnalogOdchodovyCas2[16];
int AktiveCasPomoc1;
unsigned long AktiveCasPomoc2,AktiveCasPomoc3,AktiveCasPomoc4;
unsigned long AktivovatAnalog[16];
public:int AktivovatAnalog2[16];

public:void Analog_Poprve_Zapnuto(){
for(int q=0;q<52;q++){
AnalogPrichodovyCas2[q]=0;
AnalogOdchodovyCas2[q]=0;
if(q<16){
AktivovatAnalog2[q]=0;
}}}



public:void VlozAnalogPrichodovyCas(int i){//i udava ktereho pinu se to tyka
if(Analog_Ovladani[i].Casova_Aktivace<12){
int pomoc=Analog_Ovladani[i].Casova_Aktivace;
if(((Casova_Aktivace[pomoc].Minuta_Prichod<60)&&(Casova_Aktivace[pomoc].Vterina_Prichod<60))&&((Casova_Aktivace[pomoc].Minuta_Prichod>-1)&&(Casova_Aktivace[pomoc].Vterina_Prichod>0))){
  AnalogPrichodovyCas[i]=Casova_Aktivace[pomoc].Minuta_Prichod*60000+Casova_Aktivace[pomoc].Vterina_Prichod*1000+millis();

}else AnalogPrichodovyCas[i]=0;
}else AnalogPrichodovyCas[i]=0;
}

public:void VlozAnalogOdchodovyCas(int i){
if(Analog_Ovladani[i].Casova_Aktivace<12){
int pomoc=Analog_Ovladani[i].Casova_Aktivace;
if(((Casova_Aktivace[pomoc].Minuta_Odchod<60)&&(Casova_Aktivace[pomoc].Vterina_Odchod<60))&&((Casova_Aktivace[pomoc].Minuta_Odchod>-1)&&(Casova_Aktivace[pomoc].Vterina_Odchod>0))){
  AnalogOdchodovyCas[i]=Casova_Aktivace[pomoc].Minuta_Odchod*60000+Casova_Aktivace[pomoc].Vterina_Odchod*1000+millis();
}else AnalogOdchodovyCas[i]=0;
}else AnalogOdchodovyCas[i]=0;
}



public:void Analog_Pin_Kontrola(){
 
  for(int i=0;i<16;i++){
  if(AktivovatAnalog2[i]==1){
   if(AktivovatAnalog[i]<millis()){
   Analog_Ovladani[i].Snimat=1;
     AktivovatAnalog2[i]=0;
   }}}   
  
for(int i=0;i<16;i++){//i prochazi piny a pozice
if(Analog_Ovladani[i].Snimat!=1){
AnalogPrichodovyCas2[i]=0;
  AnalogOdchodovyCas2[i]=0;
}
if(Analog_Ovladani[i].Snimat==1){
  
       if(Analog_Ovladani[i].Casova_Aktivace<12){
        AktiveCasPomoc1=Analog_Ovladani[i].Casova_Aktivace;//ulozeni do aktivecaspomoc1 misto,kde jsou hodnoty pro obdobi aktivity pinu
        if(((Casova_Aktivace[AktiveCasPomoc1].Hodina_Aktivace<24)&&(Casova_Aktivace[AktiveCasPomoc1].Hodina_Aktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Minuta_Aktivace<60)&&(Casova_Aktivace[AktiveCasPomoc1].Minuta_Aktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Vterina_Aktivace<60)&&(Casova_Aktivace[AktiveCasPomoc1].Vterina_Aktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Hodina_Deaktivace<24)&&(Casova_Aktivace[AktiveCasPomoc1].Hodina_Deaktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Minuta_Deaktivace<60)&&(Casova_Aktivace[AktiveCasPomoc1].Minuta_Deaktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Vterina_Deaktivace<60)&&(Casova_Aktivace[AktiveCasPomoc1].Vterina_Deaktivace>-1)))
         {
          AktiveCasPomoc2=Casova_Aktivace[AktiveCasPomoc1].Hodina_Aktivace*3600+Casova_Aktivace[AktiveCasPomoc1].Minuta_Aktivace*60+Casova_Aktivace[AktiveCasPomoc1].Vterina_Aktivace;
          AktiveCasPomoc3=Casova_Aktivace[AktiveCasPomoc1].Hodina_Deaktivace*3600+Casova_Aktivace[AktiveCasPomoc1].Minuta_Deaktivace*60+Casova_Aktivace[AktiveCasPomoc1].Vterina_Deaktivace;
          }else {AktiveCasPomoc2=0;AktiveCasPomoc3=1000000000;}//kdyz budou hodnoty v casove aktivaci > nez hod/min/sec, pak se bude snimat stale
         AktiveCasPomoc4=Hodiny*3600+Minuty*60+Vteriny;
       
          if((AktiveCasPomoc2<AktiveCasPomoc4)||(AktiveCasPomoc3>AktiveCasPomoc4))
  {
  
  
 if(AnalogOdchodovyCas2[i]==0){
  //Serial.write("ODCHODOVY CAS NASTAV je:\n");
  VlozAnalogOdchodovyCas(i);         
  //Serial.write(AnalogOdchodovyCas[i]);
  //Serial.write("\n");
        AnalogOdchodovyCas2[i]=1;
   }
   
    if(AnalogOdchodovyCas[i]<millis()){
     analoghodnota = analogRead(i);
     if((analoghodnota<(Analog_Ovladani[i].Minimum)*4)||(analoghodnota>(Analog_Ovladani[i].Maximum)*4))
 {  
       if(AnalogPrichodovyCas2[i]==0){//kdyz poprve podminka neni splnena prichod cas=1
        //Serial.write("PRICHODOVY CAS NASTAV je:\n");
        VlozAnalogPrichodovyCas(i); 
        AnalogPrichodovyCas2[i]=1;}
     
       if(AnalogPrichodovyCas[i]<millis()){//pri prekroceni maximalni prichodoveho casu se aktivuje zmena
            
    int Casova_Aktivace_13;
            if(Casova_Aktivace[AktiveCasPomoc1].Aktiv_Zmena_Na<3) 
             Casova_Aktivace_13=Casova_Aktivace[AktiveCasPomoc1].Aktiv_Zmena_Na;
        
       
           int qw=1000;
           int hodnota=EEPROM.read(qw);
           while((hodnota!=255)&&(i<4000)){
              qw++;
           hodnota=EEPROM.read(qw);             
            }
           
           EEPROM.write(qw,EEPROM.read(999));
           qw++;
           EEPROM.write(qw,EEPROM.read(997));
                    qw++;
           EEPROM.write(qw,EEPROM.read(998));
           qw++;
           EEPROM.write(qw,(byte)Hodiny);
           qw++;
           EEPROM.write(qw,(byte)Minuty);
           qw++;
           EEPROM.write(qw,(byte)i);
           qw++;
            EEPROM.write(qw,(byte)255);
                 delay(25);
               Serial.write("ARDUINOPOPLACHANALOG");
           Serial.write(i);
           Serial.write(analoghodnota/4);
           AktivovatAnalog2[i]=1;
           AktivovatAnalog[i]=(Ostatni.DobaOpetovneReakce*1000 + millis());
           Analog_Ovladani[i].Snimat=0;
            delay(75);
           if((Casova_Aktivace_13==0)||(Casova_Aktivace_13==1)){
                         
         for(int q=0;q<16;q++){
         if((Casova_Aktivace[AktiveCasPomoc1].Vystupy[q]<68)){//q je pozice prochazena, jestli se ma neco zmenit
           if(Casova_Aktivace[AktiveCasPomoc1].Vystupy[q]<16){//jedna se o zmenu na analogovem vstupu
            int pomocne=Casova_Aktivace[AktiveCasPomoc1].Vystupy[q];//nahrani pinu,ktery se ma zmenit do promenne pomocne
           Analog_Ovladani[pomocne].Snimat=Casova_Aktivace_13;//zmena aktivace daneho pinu
     
  }else {//zmena se provede na digitalnim pinu
          int pomocne=Casova_Aktivace[AktiveCasPomoc1].Vystupy[q];//nahrani pinu,ktery se ma zmenit do promenne pomocne
                     int pomocne2=pomocne-16;//pro nahravani do digitpinu od zacatku
                      Digital_Ovladani[pomocne2].Snimat=Casova_Aktivace_13;//zmena aktivace daneho pinu
       }}
     
  }

}else if(Casova_Aktivace_13==2){
           for(int q=0;q<16;q++){
         if((Casova_Aktivace[AktiveCasPomoc1].Vystupy[q]<68)){//i=soucasny analogovy pin a q je pozice prochazena, jestli se ma neco zmenit
           if(Casova_Aktivace[AktiveCasPomoc1].Vystupy[q]<16){//jedna se o zmenu na analogovem vstupu
            int pomocne=Casova_Aktivace[AktiveCasPomoc1].Vystupy[q];//nahrani pinu,ktery se ma zmenit do promenne pomocne
                 
                   if( Analog_Ovladani[pomocne].Snimat==0){         //zamena aktivace daneho pinu
                        Analog_Ovladani[pomocne].Snimat=1;}
                         else if( Analog_Ovladani[pomocne].Snimat==1){         
                        Analog_Ovladani[pomocne].Snimat=0;}
  }else {//zmena se provede na digitalnim pinu
          int pomocne=Casova_Aktivace[AktiveCasPomoc1].Vystupy[q];//nahrani pinu,ktery se ma zmenit do promenne pomocne
                     int pomocne2=pomocne-16;//pro nahravani do digitpinu od zacatku
                        if( Digital_Ovladani[pomocne2].Snimat==0){         //zamena aktivace daneho pinu
                        Digital_Ovladani[pomocne2].Snimat=1;
                                      }
                         else if((Digital_Ovladani[pomocne2].Snimat==1)){         
                        Digital_Ovladani[pomocne2].Snimat=0;}
          }}
     }
         
  } AnalogPrichodovyCas2[i]=0; 
   
  /* Serial.write("Stavy analog pinu 2!!!\n");
           for(int q=0;q<16;q++){
            Serial.write(Analog_Ovladani[q].Snimat);
                   Serial.write("Piny \n");
                   }
            Serial.write("Stavy digital pinu 2!!!\n");
           for(int q=0;q<52;q++){
            Serial.write(Digital_Ovladani[q].Snimat);
                   Serial.write("Piny \n");
           }*/
         
       }
 }else AnalogPrichodovyCas2[i]=0;//Kdyz analog hodnota je v poradku, pak do prichodoveho casu =0
  }}else{/*Serial.write("NEVyhovuje cAS1\n");*/}//podminka pro vyhovujici aktivni cas

}else {//kdyz bude hodnota v analogpinovladani>=12 pak se vstup nastavi jako nesnimat!!!!
//Serial.write("SPATNE NASTAVENY CAS2- Vetsi hodnota nez 12 v odkazu na Casovou aktivaci\n");
Analog_Ovladani[i].Snimat=0;
}}




}}};Analog_Kontrola Analog_Kontrola;//KONEC Analog_Kontrola


//////////////////////////////////////////////////////// 3 Digitalal_Kontrola /////////////////////////////////////////////////
class Digital_Kontrola{
int Puvodni_Stav[52];
unsigned long DigitPrichodovyCas[52];
int DigitPrichodovyCas2[52];
unsigned long DigitOdchodovyCas[52];
int DigitOdchodovyCas2[52];
int AktiveCasPomoc1;
unsigned long AktiveCasPomoc2,AktiveCasPomoc3,AktiveCasPomoc4;
unsigned long Doba_Stavu_2[52];
unsigned long AktivovatDigital[52];
public:int AktivovatDigital2[52];


  public:void Digit_Poprve_Zapnuto(){
 for(int i=0;i<52;i++){
 Puvodni_Stav[i]=0;
 DigitPrichodovyCas2[i]=0;
 DigitOdchodovyCas2[i]=0;
 Doba_Stavu_2[i]=0;
 if(i<52){
AktivovatDigital2[i]=0;
}
 }}
  
  public:void VlozDigitOdchodovyCas(int i){
if(Digital_Ovladani[i].Casova_Aktivace<12){
int pomoc=Digital_Ovladani[i].Casova_Aktivace;
if(((Casova_Aktivace[pomoc].Minuta_Odchod<60)&&(Casova_Aktivace[pomoc].Vterina_Odchod<60))&&((Casova_Aktivace[pomoc].Minuta_Odchod>-1)&&(Casova_Aktivace[pomoc].Vterina_Odchod>0))){
  DigitOdchodovyCas[i]=(Casova_Aktivace[pomoc].Minuta_Odchod)*60000+(Casova_Aktivace[pomoc].Vterina_Odchod)*1000+millis();
}else DigitOdchodovyCas[i]=0;
}else DigitOdchodovyCas[i]=0;
}

   public:void VlozDigitPrichodovyCas(int i){//i udava ktereho pinu se to tyka
if(Digital_Ovladani[i].Casova_Aktivace<12){
int pomoc=Digital_Ovladani[i].Casova_Aktivace;
if(((Casova_Aktivace[pomoc].Minuta_Prichod<60)&&(Casova_Aktivace[pomoc].Vterina_Prichod<60))&&((Casova_Aktivace[pomoc].Minuta_Prichod>-1)&&(Casova_Aktivace[pomoc].Vterina_Prichod>0))){
  DigitPrichodovyCas[i]=(Casova_Aktivace[pomoc].Minuta_Prichod)*60000+(Casova_Aktivace[pomoc].Vterina_Prichod)*1000+millis();
}else DigitPrichodovyCas[i]=0;
}else DigitPrichodovyCas[i]=0;
}

   public:void Doba_Stavu2(int i){//i udava ktereho pinu se to tyka
if(Digital_Ovladani[i].Casova_Aktivace<12){
int pomoc=Digital_Ovladani[i].Casova_Aktivace;
if((Casova_Aktivace[pomoc].Doba_Stavu2<256)&&(Casova_Aktivace[pomoc].Doba_Stavu2>0)){
  Doba_Stavu_2[i]=Casova_Aktivace[pomoc].Doba_Stavu2*1000+millis();
}else Doba_Stavu_2[i]=0;
}else Doba_Stavu_2[i]=0;
}


public:void Digit_Pin_Kontrola(){
 for(int i=0;i<52;i++){
  if(AktivovatDigital2[i]==1){
   if(AktivovatDigital[i]<millis()){
   Digital_Ovladani[i].Snimat=1;
     AktivovatDigital2[i]=0;
   }}}

//PROHLEDANI CELEHO POLE DigitPin_Ovladani A ZJISTENI,CO SNIMAT A CO NE
for(int i=0;i<52;i++){
  bool jevheslu1=false;
  bool jevheslu2=false;
  bool jevheslu3=false;
  bool jevheslu4=false;

  for(int nnn=7;nnn<27;nnn++){
  if((Ostatni.Heslo_Zastrez1[nnn]-16)==i)
  {jevheslu1=true;
  }
 if((Ostatni.Heslo_Zastrez2[nnn]-16)==i)
  {jevheslu2=true;
  }
  if((Ostatni.Heslo_Zastrez3[nnn]-16)==i)
  {jevheslu3=true;
  }
  if((Ostatni.Heslo_Zastrez4[nnn]-16)==i)
  {jevheslu4=true;
  } 
  }
  
  
  
  
  if(((Digital_Ovladani[i].Vystup_Nastaveni==2)||(Digital_Ovladani[i].Vystup_Nastaveni==1))&&((jevheslu1==true)||(jevheslu2==true)||(jevheslu3==true)||(jevheslu4==true))){
  
    if(jevheslu1==true){
    if(Ostatni.Heslo_Zastrez1[6]==0){
    pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, LOW);
    }else {pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, HIGH);}      
    }else  if(jevheslu2==true){
    if(Ostatni.Heslo_Zastrez2[6]==0){
    pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, LOW);
    }else {pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, HIGH);}}else  if(jevheslu3==true){
    if(Ostatni.Heslo_Zastrez3[6]==0){
    pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, LOW);
    }else {pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, HIGH);}}else  if(jevheslu4==true){
    if(Ostatni.Heslo_Zastrez4[6]==0){
    pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, LOW);
    }else {pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, HIGH);}}
    
  
  
  }else if((Digital_Ovladani[i].Snimat!=1)&&(i!=11)){//kdyz bude nastavena 0,tak se nastavi log nula na vystupy
 if((Digital_Ovladani[i].Vystup_Nastaveni!=2)&&(Digital_Ovladani[i].Vstup_Nastaveni==0)){
  pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, LOW); }else if((Digital_Ovladani[i].Vystup_Nastaveni==2)&&(Digital_Ovladani[i].Vstup_Nastaveni==0)){
   pinMode(i+2, OUTPUT); 
if(i+2>12){
 digitalWrite(i+2, HIGH);}else {
   if(Digital_Ovladani[i].Casova_Aktivace<12){
      AktiveCasPomoc1=Digital_Ovladani[i].Casova_Aktivace;
  analogWrite(i+2, Casova_Aktivace[AktiveCasPomoc1].Pwm);}
 }
}
 
 //Puvodni_Stav[i]=0;
 DigitPrichodovyCas2[i]=0;
 DigitOdchodovyCas2[i]=0;
 Doba_Stavu_2[i]=0;
}
 
 if((Digital_Ovladani[i].Snimat==1)&&(i!=11)){
     if(Digital_Ovladani[i].Casova_Aktivace<12){
        AktiveCasPomoc1=Digital_Ovladani[i].Casova_Aktivace;//ulozeni do aktivecaspomoc misto,kde jsou hodnoty pro obdobi aktivity pinu
        if(((Casova_Aktivace[AktiveCasPomoc1].Hodina_Aktivace<24)&&(Casova_Aktivace[AktiveCasPomoc1].Hodina_Aktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Minuta_Aktivace<60)&&(Casova_Aktivace[AktiveCasPomoc1].Minuta_Aktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Vterina_Aktivace<60)&&(Casova_Aktivace[AktiveCasPomoc1].Vterina_Aktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Hodina_Deaktivace<24)&&(Casova_Aktivace[AktiveCasPomoc1].Hodina_Deaktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Minuta_Deaktivace<60)&&(Casova_Aktivace[AktiveCasPomoc1].Minuta_Deaktivace>-1))&&((Casova_Aktivace[AktiveCasPomoc1].Vterina_Deaktivace<60)&&(Casova_Aktivace[AktiveCasPomoc1].Vterina_Deaktivace>-1)))
         {
          AktiveCasPomoc2=Casova_Aktivace[AktiveCasPomoc1].Hodina_Aktivace*3600+Casova_Aktivace[AktiveCasPomoc1].Minuta_Aktivace*60+Casova_Aktivace[AktiveCasPomoc1].Vterina_Aktivace;
          AktiveCasPomoc3=Casova_Aktivace[AktiveCasPomoc1].Hodina_Deaktivace*3600+Casova_Aktivace[AktiveCasPomoc1].Minuta_Deaktivace*60+Casova_Aktivace[AktiveCasPomoc1].Vterina_Deaktivace;
          }else {AktiveCasPomoc2=0;AktiveCasPomoc3=1000000000;}//kdyz budou hodnoty v casove aktivaci > nez hod/min/sec, pak se bude snimat stale
         AktiveCasPomoc4=Hodiny*3600+Minuty*60+Vteriny;
       
       if(Digital_Ovladani[i].Vystup_Nastaveni!=0){//kdyz jde o vystup pak cas nebude bran v uvahu
       AktiveCasPomoc2=0;AktiveCasPomoc3=1000000000;
       }
       
      
          if((AktiveCasPomoc2<AktiveCasPomoc4)||(AktiveCasPomoc3>AktiveCasPomoc4))
  {
         
       if(Digital_Ovladani[i].Vystup_Nastaveni!=0)//kdyz jde o vystup pak cas nebude bran v uvahu
       if( DigitOdchodovyCas2[i]==0){
       VlozDigitOdchodovyCas(i);
       DigitOdchodovyCas2[i]=1;
        // Serial.write("ODCHODOVY CAS DIGIT VLOZEN\n"); 
     }
       
       if(DigitOdchodovyCas[i]<millis()){   
          if(Puvodni_Stav[i]==0){
           // Serial.write("PIN nastaven\n"); 
            
 if(Digital_Ovladani[i].Vstup_Nastaveni==1){ 
 pinMode(i+2, INPUT); 
 digitalWrite(i+2, HIGH); 
   int sensorValue = digitalRead(i+2);
 // Serial.writeln(sensorValue, DEC);
 }//+2 protoze prvni dva piny budou slouzit pro jine ucely
 else if(Digital_Ovladani[i].Vstup_Nastaveni==2){ 
 pinMode(i+2, INPUT); 
  digitalWrite(i+2, HIGH); 
   int sensorValue = digitalRead(i+2);
  //Serial.writeln(sensorValue, DEC);
 }
 
 if(Digital_Ovladani[i].Vystup_Nastaveni==1){ 
  pinMode(i+2, OUTPUT); 
  if(i+2>12){
 digitalWrite(i+2, HIGH);}else {
 analogWrite(i+2, Casova_Aktivace[AktiveCasPomoc1].Pwm);
 } Doba_Stavu2(i);}else  if(Digital_Ovladani[i].Vystup_Nastaveni==2){
  pinMode(i+2, OUTPUT); 
 digitalWrite(i+2, LOW); 
 Doba_Stavu2(i);}
 
 
  Puvodni_Stav[i]=1;
 
          }//poprve spusteno
          else {
          if((Digital_Ovladani[i].Vstup_Nastaveni==1)||(Digital_Ovladani[i].Vstup_Nastaveni==2))  
          { 
            int DigitHodnota=digitalRead(i+2);
              if(((Digital_Ovladani[i].Vstup_Nastaveni==2)&&(DigitHodnota==0))||((Digital_Ovladani[i].Vstup_Nastaveni==1)&&(DigitHodnota==1))){          
                        
               if( DigitPrichodovyCas2[i]==0){
       VlozDigitPrichodovyCas(i);
      DigitPrichodovyCas2[i]=1;
         //Serial.write("Prichodovy CAS DIGIT VLOZEN"); 
     }
          
           if(DigitPrichodovyCas[i]<millis()){
          
         // Serial.write("Spoustim vystupy\n");
         unsigned short POPLACH=Digital_Ovladani[i].Casova_Aktivace;
     unsigned short Casova_Aktivace_13;
    if((Casova_Aktivace[POPLACH].Aktiv_Zmena_Na<3)&&(POPLACH<12)){//abychom mohli vystupy aktivovat, musi byt POPLACH<12 a ArduinoEeprom.Casova_Aktivace[POPLACH].zmenaaktivna<3
             Casova_Aktivace_13=Casova_Aktivace[POPLACH].Aktiv_Zmena_Na;}else Casova_Aktivace_13=3;//kdyz nektera podminka nebude splnena, tak se vystupy neprepnou
             int qw=1000;
           int hodnota=EEPROM.read(qw);
           while((hodnota!=255)&&(i<4000)){
              qw++;
           hodnota=EEPROM.read(qw);             
            }
           
           EEPROM.write(qw,EEPROM.read(999));
           qw++;
           EEPROM.write(qw,EEPROM.read(997));
                    qw++;
           EEPROM.write(qw,EEPROM.read(998));
           qw++;
           EEPROM.write(qw,(byte)Hodiny);
           qw++;
           EEPROM.write(qw,(byte)Minuty);
           qw++;
           EEPROM.write(qw,(byte)(i+102));
           qw++;
            EEPROM.write(qw,(byte)255);
             delay(25);
             Serial.write("ARDUINOPOPLACHDIGITA");
           Serial.write((byte)i);
           Serial.write((byte)DigitHodnota);
           AktivovatDigital2[i]=1;
           AktivovatDigital[i]=(Ostatni.DobaOpetovneReakce*1000 + millis());
           Digital_Ovladani[i].Snimat=0;
            delay(75);
         if((Casova_Aktivace_13==0)||(Casova_Aktivace_13==1)){
         for(int q=0;q<16;q++){
         if((Casova_Aktivace[POPLACH].Vystupy[q]<68)){//i=soucasny analogovy pin a q je pozice prochazena, jestli se ma neco zmenit
           if(Casova_Aktivace[POPLACH].Vystupy[q]<16){//jedna se o zmenu na analogovem vstupu
            int pomocne=Casova_Aktivace[POPLACH].Vystupy[q];//nahrani pinu,ktery se ma zmenit do promenne pomocne
            Analog_Ovladani[pomocne].Snimat=Casova_Aktivace_13;//zmena aktivace daneho pinu
      
  }else {//zmena se provede na digitalnim pinu
          int pomocne=Casova_Aktivace[POPLACH].Vystupy[q];//nahrani pinu,ktery se ma zmenit do promenne pomocne
                     int pomocne2=pomocne-16;//pro nahravani do digitpinu od zacatku
                      Digital_Ovladani[pomocne2].Snimat=Casova_Aktivace_13;//zmena aktivace daneho pinu
     
     }}
     
  }

}else if(Casova_Aktivace_13==2){
           for(int q=0;q<16;q++){
         if((Casova_Aktivace[POPLACH].Vystupy[q]<68)){//i=soucasny analogovy pin a q je pozice prochazena, jestli se ma neco zmenit
           if(Casova_Aktivace[POPLACH].Vystupy[q]<16){//jedna se o zmenu na analogovem vstupu
            int pomocne=Casova_Aktivace[POPLACH].Vystupy[q];//nahrani pinu,ktery se ma zmenit do promenne pomocne
                 
                   if(  Analog_Ovladani[pomocne].Snimat==0){         //zamena aktivace daneho pinu
                           if(Analog_Kontrola.AktivovatAnalog2[pomocne]!=1)
                      {  Analog_Ovladani[pomocne].Snimat=1;
                  } Analog_Kontrola.AktivovatAnalog2[pomocne]=0; 
                       
                    }else if( Analog_Ovladani[pomocne].Snimat==1){         
                        Analog_Ovladani[pomocne].Snimat=0;
                    Analog_Kontrola.AktivovatAnalog2[pomocne]=0;                                    
                   }
                         
                                                  
                         
  }else {//zmena se provede na digitalnim pinu
          int pomocne=Casova_Aktivace[POPLACH].Vystupy[q];//nahrani pinu,ktery se ma zmenit do promenne pomocne
                     int pomocne2=pomocne-16;//pro nahravani do digitpinu od zacatku
                        if(  Digital_Ovladani[pomocne2].Snimat==0){         //zamena aktivace daneho pinu
                           if(AktivovatDigital2[pomocne2]!=1)
                      {  Digital_Ovladani[pomocne2].Snimat=1;
                  } AktivovatDigital2[pomocne2]=0;
                        
                        }
                         else if((Digital_Ovladani[pomocne2].Snimat==1)){         
                        Digital_Ovladani[pomocne2].Snimat=0;
                        AktivovatDigital2[pomocne2]=0;}
          }}
     }
         
  }
                                           
            DigitPrichodovyCas2[i]=0;
          }//kdyz uplynul prichodovy cas
          
          
          }else  DigitPrichodovyCas2[i]=0;
           
         }//kdyz se jedna o vstup 
           
           else if((Digital_Ovladani[i].Vystup_Nastaveni==1)||(Digital_Ovladani[i].Vystup_Nastaveni==2)){
           if(Doba_Stavu_2[i]<millis()){
           Digital_Ovladani[i].Snimat=0;
           Puvodni_Stav[i]=0;
           }}
           
        }//kdyz neni poprve spusteno
       }//Odchodovy cas uplynul

   }//splnen casovy interval,ve kterem je pin aktivni
 
 
 }//kdyz hodnota v DigitPin_Ovladani [2]>12
else { Digital_Ovladani[i].Snimat=0;
//Serial.write("Spatna hodnota pro casovou aktivaci");
} 

 
 }//kdyz se digitpin=1
  
}




}};Digital_Kontrola Digit_Kontrola;

//////////////////////////////////////////////// 4 KONTROLA KOMUNIKACE////////////////////////////////////////////////
struct Kontrola_Komunikace{
unsigned long long OdpocetOdezvyPc;
public:unsigned long long DobaPoplachuPc;

public:void Inicializuj(){
DobaPoplachuPc=0;
}

public:void PcPoplach(){
 if((Ostatni.Heslo_Zastrez1[6]==1)||(Ostatni.Heslo_Zastrez2[6]==1)||(Ostatni.Heslo_Zastrez3[6]==1)||(Ostatni.Heslo_Zastrez4[6]==1))
if(Ostatni.Hlidani_Pc[0]==1){//kdyz bude zde 2,pak hlidat pc stale
if(OdpocetOdezvyPc<millis()){
  pinMode(13,OUTPUT);
 analogWrite(13, Ostatni.Hlidani_Pc[3]);
   DobaPoplachuPc=(Ostatni.Hlidani_Pc[2])*1000+millis();
OdpocetOdezvyPc=millis()+1010000;//opetovne zacne reagovat az za tuhle dobu
    }}
    
if(DobaPoplachuPc<millis()){
 analogWrite(13, 0);
}}



  public:void Kontrola_Komunikace1(){
        
char Prvni='1';
  if (Serial.available()) {
    Prvni=Serial.read();
    if(Prvni=='P'){
    delay(8);
     if (Serial.available()) {  
char b[20];
 for (int Aktualni_pozice=0;Aktualni_pozice < 12;Aktualni_pozice++){
 b[Aktualni_pozice]=Serial.read();
}
 b[12]=0;//zakoncovaci znak


//////////////////////////////////////POROVNANI B //////////////////////////////////////////////////////////////////////
if(strcmp(b,Pocitachistor)==0){
pocitachistor();}

if(strcmp(b,vymazh)==0){
Vymaz();}
if(strcmp(b,Nahrejcas)==0){
nahrejcas();}
if(strcmp(b,Poslicas)==0){
poslicas();}
if(strcmp(b,nahrejeeprom)==0){
nahrejEeprom();}
if(strcmp(b,hesloz)==0){
heslozastrez();}
if(strcmp(b,hesloz2)==0){
heslozastrez2();}
if(strcmp(b,hesloz3)==0){
heslozastrez3();}
if(strcmp(b,hesloz4)==0){
heslozastrez4();}
if(strcmp(b,zastrez)==0){
Zastrez();}
else if(strcmp(b,eeprom)==0){
Eeprom();}
else if(strcmp(b,eepro2)==0){
Eepro2();}
else if(strcmp(b,alarmm)==0){
Alarmm();}
else if(strcmp(b,odezva)==0){
Odezva();}
else if(strcmp(b,odezv2)==0){
Odezv2();}
else if(strcmp(b,okkkkk)==0){
Okkkkk();}
else if(strcmp(b,kdojsi)==0){
Kdojsi();}
else if(strcmp(b,chybaa)==0){
Chybaa();}
else if(strcmp(b,zjisti)==0){
Zjisti();}
}}}}
////////////////////////////////////////pocitachistor
public:void pocitachistor(){
Serial.write("ARDUINOHISTOR");

byte hodnota=1;

for(int pozice=1000;((hodnota!=255)&&(pozice<4000));pozice++){
  hodnota=(byte)EEPROM.read(pozice);
  Serial.write(hodnota);}
  if(hodnota==0){
  Serial.write("KONECKOM");
  }
 
}
/////////////////////////////////////////vymaz
public:void Vymaz(){

  
 int i;
  int Aktualni_Pozice=0;
  int KtereHesloAktiv=0;
 

if(Serial.available()){  
//int Celkem_pozice=Serial.available();//pro zjisteni, kolik bytu ceka
int KONTROLA[6];
for(i=0;i<6;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY pro zjisteni odkud nahravat

Aktualni_Pozice++;

}
/////////////////// POROVNANI S PAMETI//////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Eeprom_Heslo[i]){//KONTROLA S heslem pro pristup k pameti
i=100;
}}
if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){  
  int r=255;
  for(int qwer=1000;qwer<4000;qwer++){
  EEPROM.write(qwer,r);
 
  }
  
  Serial.write("ARDUINOOKKONECKOM");
}}else {Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");}
  
  
}

///////////////////////////////////////////////////////////////Zjisteni a nastaveni casu
public:void poslicas(){
Serial.write("ARDUINOPOSCAS");
  Serial.write((byte)Hodiny);
  Serial.write((byte)Minuty);
  Serial.write((byte)Vteriny);
  int dny1=0;

  if(Dny>=300){dny1=Dny-300;
  Serial.write((byte)3);
  Serial.write((byte)dny1);
  }else  if(Dny>=200){dny1=Dny-200;
  Serial.write((byte)2);
  Serial.write((byte)dny1);
  }else  if(Dny>=100){dny1=Dny-100;
  Serial.write((byte)1);
    Serial.write((byte)dny1);
  }else {Serial.write((byte)0);Serial.write((byte)Dny);}
    
    Serial.write((byte)Rok);
    
  Serial.write("KONECKOM");
}
public:void nahrejcas(){

  if(Serial.available()==5){
    int hodiny=Serial.read();
    int minuty=Serial.read();
    
    int dny1=(int)Serial.read();
    EEPROM.write(997,(byte)dny1);
    int dny2=(int)Serial.read();
     EEPROM.write(998,(byte)dny2);
     
    if(dny1==3){
    Dny=dny2+300;
    }else if(dny1==2){
    Dny=dny2+200;
    }else if(dny1==1){
    Dny=dny2+100;
    }else Dny=dny2;
    
    
    Rok=(int)Serial.read();
       EEPROM.write(999,(byte)Rok);
Cas.Cas(hodiny,minuty,0);
  Serial.write("ARDUINOOKKONECKOM");}else Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");
}


public:void nahrejEeprom(){

Serial.write("ARDUINONAHREJ");
for(int i=0;i<1000;i++){
  if(i==827){////////NA MISTECH, KDE JE INFORMACE O ZASTREZENI POSILAME AKTUALNI HODNOTU, V EEPROM JE TOTIZ VZDY NULA,AT PO RESETU NENI NIC AKTIVNI
  Serial.write((byte)Ostatni.Heslo_Zastrez1[6]);
  }else if(i==857){
    Serial.write((byte)Ostatni.Heslo_Zastrez2[6]);
  }else if(i==887){
    Serial.write((byte)Ostatni.Heslo_Zastrez3[6]);
  }else if(i==917){
    Serial.write((byte)Ostatni.Heslo_Zastrez4[6]);
  }else {Serial.write(EEPROM.read(i));}
}
Serial.write("KONECKOM");}

public:int kterezmenaheslo;
public:void heslozastrez(){///////////////////////////////ZMENA HESLA PRO ZASTREZENI 1/////////
kterezmenaheslo=0;
  int i;
  int Aktualni_Pozice=0;

if(Serial.available()){
int KONTROLA[20];

for(i=0;i<6;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY
Aktualni_Pozice++;}
///////////////////////////////// POROVNANI S PAMETI//////////////////////////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Heslo_Zastrez1[i]){//KONTROLA S ZASTREZ1
i=100;
}}if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){
PristupKEeprom2();
}}}
public:void heslozastrez2(){///////////////////////////////ZMENA HESLA PRO ZASTREZENI 2/////////
kterezmenaheslo=0;
  int i;
  int Aktualni_Pozice=0;

if(Serial.available()){
int KONTROLA[20];

for(i=0;i<6;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY
Aktualni_Pozice++;}
///////////////////////////////// POROVNANI S PAMETI//////////////////////////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Heslo_Zastrez2[i]){//KONTROLA S ZASTREZ2
i=100;
}}if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){
PristupKEeprom2();
}}}

public:void heslozastrez3(){///////////////////////////////ZMENA HESLA PRO ZASTREZENI 3/////////
kterezmenaheslo=0;
  int i;
  int Aktualni_Pozice=0;

if(Serial.available()){
int KONTROLA[20];

for(i=0;i<6;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY
Aktualni_Pozice++;}
///////////////////////////////// POROVNANI S PAMETI//////////////////////////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Heslo_Zastrez3[i]){//KONTROLA S ZASTREZ3
i=100;}}if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){
PristupKEeprom2();
}}}

public:void heslozastrez4(){///////////////////////////////ZMENA HESLA PRO ZASTREZENI 4/////////
kterezmenaheslo=0;
  int i;
  int Aktualni_Pozice=0;

if(Serial.available()){
int KONTROLA[20];

for(i=0;i<6;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY
Aktualni_Pozice++;}
///////////////////////////////// POROVNANI S PAMETI//////////////////////////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Heslo_Zastrez4[i]){//KONTROLA S ZASTREZ4
i=100;
}}if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){
PristupKEeprom2();
}}}




public:void Zastrez(){////////////////////////////////////////ZASTREZENI
  int i;
  int Aktualni_Pozice=0;
  int KtereHesloAktiv=0;

if(Serial.available()){
byte Celkem_pozice=Serial.available();//pro zjisteni, kolik bytu ceka
int KONTROLA[Celkem_pozice];

for(i=0;i<Celkem_pozice;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY
Aktualni_Pozice++;}
///////////////////////////////// POROVNANI S PAMETI//////////////////////////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Heslo_Zastrez1[i]){//KONTROLA S ZASTREZ1
i=100;

}}if(i==6){KtereHesloAktiv=1;}
if(i==101){
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Heslo_Zastrez2[i]){//KONTROLA S ZASTREZ2
i=100;

}}if(i==6){KtereHesloAktiv=2;}
}if(i==101){
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Heslo_Zastrez3[i]){//KONTROLA S ZASTREZ3
i=100;

}}if(i==6){KtereHesloAktiv=3;}
}if(i==101){
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Heslo_Zastrez4[i]){//KONTROLA S ZASTREZ3
i=100;

}}if(i==6){KtereHesloAktiv=4;}}




if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){
for(int ii=0;ii<8;ii++){
if((char)KONTROLA[i]!=koneckom[ii])
{i=150;}
i++;
}}
/////////////////////////////////KONEC POROVNANI S PAMETI//////////////////////////////

if(i==151){//kontrola chybne komunikace 151 prooze hodtona ve for se to i jeste zvysi
Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");
}else if(i==14){
if(KtereHesloAktiv==1){delay(25); 
  if(Ostatni.Heslo_Zastrez1[6]==0)
  {Serial.write("ARDUINOZASTREZENO01KONECKOM"); Ostatni.Heslo_Zastrez1[6]=1;delay(75);}else if(Ostatni.Heslo_Zastrez1[6]==1){Serial.write("ARDUINOODSTREZENO01KONECKOM");Ostatni.Heslo_Zastrez1[6]=0;delay(75);}
  
  for(int u=7;u<27;u++){
Hlidat2(Ostatni.Heslo_Zastrez1[u]);}}

else if(KtereHesloAktiv==2){delay(25);
  if(Ostatni.Heslo_Zastrez2[6]==0)
  {Serial.write("ARDUINOZASTREZENO02KONECKOM"); Ostatni.Heslo_Zastrez2[6]=1;delay(75);}else if(Ostatni.Heslo_Zastrez2[6]==1){Serial.write("ARDUINOODSTREZENO02KONECKOM");Ostatni.Heslo_Zastrez2[6]=0;delay(75);}
 for(int u=7;u<27;u++){
Hlidat2(Ostatni.Heslo_Zastrez2[u]);}
}
else if(KtereHesloAktiv==3){delay(25);
  if(Ostatni.Heslo_Zastrez3[6]==0)
  {Serial.write("ARDUINOZASTREZENO03KONECKOM"); Ostatni.Heslo_Zastrez3[6]=1;delay(75);}else if(Ostatni.Heslo_Zastrez3[6]==1){Serial.write("ARDUINOODSTREZENO03KONECKOM");Ostatni.Heslo_Zastrez3[6]=0;delay(75);}
for(int u=7;u<27;u++){
Hlidat2(Ostatni.Heslo_Zastrez3[u]);}
}

else if(KtereHesloAktiv==4){delay(25);
  if(Ostatni.Heslo_Zastrez4[6]==0)
  {Serial.write("ARDUINOZASTREZENO04KONECKOM"); Ostatni.Heslo_Zastrez4[6]=1;delay(75);}else if(Ostatni.Heslo_Zastrez4[6]==1){Serial.write("ARDUINOODSTREZENO04KONECKOM");Ostatni.Heslo_Zastrez4[6]=0;delay(75);}
for(int u=7;u<27;u++){
Hlidat2(Ostatni.Heslo_Zastrez4[u]);}
}
}
}else Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");}


public:void Hlidat2(int AktiveCasPomoc1){
         if((AktiveCasPomoc1<68)){//i=soucasny analogovy pin a q je pozice prochazena, jestli se ma neco zmenit
           if(AktiveCasPomoc1<16){//jedna se o zmenu na analogovem vstupu
            int pomocne=AktiveCasPomoc1;//nahrani pinu,ktery se ma zmenit do promenne pomocne
                    if( Analog_Ovladani[pomocne].Snimat==0){         //zamena aktivace daneho pinu
                       if(Analog_Kontrola.AktivovatAnalog2[pomocne]!=1)
                      {  Analog_Ovladani[pomocne].Snimat=1;
                  } Analog_Kontrola.AktivovatAnalog2[pomocne]=0; 
                       
                    }else if( Analog_Ovladani[pomocne].Snimat==1){         
                        Analog_Ovladani[pomocne].Snimat=0;
                    Analog_Kontrola.AktivovatAnalog2[pomocne]=0;                                    
                   }
                   
  }else {//zmena se provede na digitalnim pinu
          int pomocne=AktiveCasPomoc1;//nahrani pinu,ktery se ma zmenit do promenne pomocne
                     int pomocne2=pomocne-16;//pro nahravani do digitpinu od zacatku

                
                        if( Digital_Ovladani[pomocne2].Snimat==0){         //zamena aktivace daneho pinu
                            if(Digit_Kontrola.AktivovatDigital2[pomocne2]!=1)
                      {  Digital_Ovladani[pomocne2].Snimat=1;
                  } Digit_Kontrola.AktivovatDigital2[pomocne2]=0;
                        
                        }
                         else if((Digital_Ovladani[pomocne2].Snimat==1)){         
                        Digital_Ovladani[pomocne2].Snimat=0;
                        Digit_Kontrola.AktivovatDigital2[pomocne2]=0;}
                                       

 }}}


//////////////////////////////////////////////// EEPROM/////////////////
public:void Eeprom(){
  int i;
  int Aktualni_Pozice=0;
  int KtereHesloAktiv=0;
 

if(Serial.available()){  
//int Celkem_pozice=Serial.available();//pro zjisteni, kolik bytu ceka
int KONTROLA[6];
for(i=0;i<6;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY
Aktualni_Pozice++;
}
/////////////////// POROVNANI S PAMETI//////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Eeprom_Heslo[i]){//KONTROLA S heslem pro pristup k pameti
i=100;
}}
if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){
  PristupKEeprom();
}}else {Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");}
}

public:void PristupKEeprom(){
 int KONTROLA=0;
 int Zakonceni[8];
 int kolikatyznak=0;
   int pozice;
  if(Serial.available()){   
    pozice=(int)Serial.read();
    pozice=pozice*100;
    delay(15);
    for(int i=0;i<5;i++){
      
   for( int Celkem_pozice=Serial.available();Celkem_pozice>0;Celkem_pozice--){
     if(kolikatyznak<100){
  EEPROM.write(pozice,(int)Serial.read());
  kolikatyznak++;
 pozice++; }else {Zakonceni[kolikatyznak-100]=(int)Serial.read();  kolikatyznak++;}
}
  }delay(1);}
 int KONTROLA2=0;//KONTROLA, ABY BYLA KOMUNIKACE UKONCENA KONECKOM
 for(int ii=0;ii<8;ii++){
if((char)Zakonceni[ii]!=koneckom[ii])
{ KONTROLA2=1;}pozice++;}
  
  if(KONTROLA2==0){//KONTROLA JE 107 PROTOYE 126 (JE I NULA)-19
 Serial.write("ARDUINOOKKONECKOM");
 ArduinoEeprom.Nahrej_Z_Pameti();
 }
else Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");
  }


//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// EEPROM2/////////////////////////////////

public:void Eepro2(){
  int i;
  int Aktualni_Pozice=0;
  int KtereHesloAktiv=0;
 

if(Serial.available()){  
//int Celkem_pozice=Serial.available();//pro zjisteni, kolik bytu ceka
int KONTROLA[6];
for(i=0;i<6;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY pro zjisteni odkud nahravat

Aktualni_Pozice++;

}
/////////////////// POROVNANI S PAMETI//////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Eeprom_Heslo[i]){//KONTROLA S heslem pro pristup k pameti
i=100;
}}
if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){
  PristupKEeprom2();
}}else {Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");}
}

public:void PristupKEeprom2(){/////////////////////////////////////////PRISTUP K NAHRAVANI DO PAMETI POVOLEN
delay(10);
 int KONTROLA=0;
 int Zakonceni[8];
 int kolikatyznak=0;
   int pozice;
   int kontrolahesla2=0;
   int kontrolahesla[6];/////////jestli neni heslo uz pouzito
  if(Serial.available()){   
    pozice=(int)Serial.read();
        pozice=801+(pozice*10);//od 800 po 30ti
if(pozice==821||pozice==851||pozice==881||pozice==911){
for(int i=0;i<6;i++){
  kontrolahesla[i]=Serial.read();
kolikatyznak++;
}
int i=0;
if((kontrolahesla[i]==EEPROM.read(821))&&(kontrolahesla[i+1]==EEPROM.read(822))&&(kontrolahesla[i+2]==EEPROM.read(823))&&(kontrolahesla[i+3]==EEPROM.read(824))&&(kontrolahesla[i+4]==EEPROM.read(825))&&(kontrolahesla[i+5]==EEPROM.read(826)))
kontrolahesla2=1;
if((kontrolahesla[i]==EEPROM.read(851))&&(kontrolahesla[i+1]==EEPROM.read(852))&&(kontrolahesla[i+2]==EEPROM.read(853))&&(kontrolahesla[i+3]==EEPROM.read(854))&&(kontrolahesla[i+4]==EEPROM.read(855))&&(kontrolahesla[i+5]==EEPROM.read(856)))
kontrolahesla2=1;
if((kontrolahesla[i]==EEPROM.read(881))&&(kontrolahesla[i+1]==EEPROM.read(882))&&(kontrolahesla[i+2]==EEPROM.read(883))&&(kontrolahesla[i+3]==EEPROM.read(884))&&(kontrolahesla[i+4]==EEPROM.read(885))&&(kontrolahesla[i+5]==EEPROM.read(886)))
kontrolahesla2=1;
if((kontrolahesla[i]==EEPROM.read(911))&&(kontrolahesla[i+1]==EEPROM.read(912))&&(kontrolahesla[i+2]==EEPROM.read(913))&&(kontrolahesla[i+3]==EEPROM.read(914))&&(kontrolahesla[i+4]==EEPROM.read(915))&&(kontrolahesla[i+5]==EEPROM.read(916)))
kontrolahesla2=1;
}
}

if(kontrolahesla2==0){
 if(pozice==821||pozice==851||pozice==881||pozice==911){
EEPROM.write(pozice,kontrolahesla[0]);EEPROM.write(pozice+1,kontrolahesla[1]);EEPROM.write(pozice+2,kontrolahesla[2]);EEPROM.write(pozice+3,kontrolahesla[3]);EEPROM.write(pozice+4,kontrolahesla[4]);EEPROM.write(pozice+5,kontrolahesla[5]);
pozice+=6;  kolikatyznak=6;}
    delay(7);
    for( int Celkem_pozice=Serial.available();Celkem_pozice>0;Celkem_pozice--){
     if(kolikatyznak<10){
  EEPROM.write(pozice,(int)Serial.read());
  kolikatyznak++;
 pozice++; }else {Zakonceni[kolikatyznak-10]=(int)Serial.read(); kolikatyznak++;}
}
 
if(pozice==821){
  int u=811;
 for(int q=0;q<6;q++){
Ostatni.Eeprom_Heslo[q]=EEPROM.read(u);
u++;}}

if(pozice==831){
  int u=821;
 for(int q=0;q<6;q++){
Ostatni.Heslo_Zastrez1[q]=EEPROM.read(u);
u++;}}

if(pozice==861){
  int u=851;
 for(int q=0;q<6;q++){
Ostatni.Heslo_Zastrez2[q]=EEPROM.read(u);
u++;}}


if(pozice==891){
  int u=881;
 for(int q=0;q<6;q++){
Ostatni.Heslo_Zastrez3[q]=EEPROM.read(u);
u++;}}

if(pozice==921){
  int u=911;
 for(int q=0;q<6;q++){
Ostatni.Heslo_Zastrez4[q]=EEPROM.read(u);
u++;}}


 int KONTROLA2=0;//KONTROLA, ABY BYLA KOMUNIKACE UKONCENA KONECKOM
 for(int ii=0;ii<8;ii++){
if((char)Zakonceni[ii]!=koneckom[ii])
{ KONTROLA2=1;}pozice++;}
  
  if(KONTROLA2==0){//KONTROLA JE 107 PROTOYE 126 (JE I NULA)-19
 Serial.write("ARDUINOOKKONECKOM");
 ArduinoEeprom.Nahrej_Z_Pameti();
 }
else Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");
  }else Serial.write("ARDUINOHESLOUZEXISTUJE");}





public:void Alarmm(){
  int i;
    int Aktualni_Pozice=0;
if(Serial.available()){
byte Celkem_pozice=Serial.available();//pro zjisteni, kolik bytu ceka
int KONTROLA[Celkem_pozice];
for(i=0;i<Celkem_pozice;i++){
KONTROLA[Aktualni_Pozice]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY
Aktualni_Pozice++;}
/////////////////// POROVNANI S PAMETI//////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Eeprom_Heslo[i]){//KONTROLA S heslem pro pristup k pameti
i=100;
}}
if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){Serial.write("ARDUINOOKKONECKOM");
  //pinMode(0,OUTPUT);
//digitalWrite(0,HIGH);

}}else {Serial.write("ARDUINOCHYBAKOMUNIKACEKONECKOM");}


}

public:void Odezva(){///////////////////////////////HLIDANI PC////////////////////////////////////////
byte Zakonceni[8];
byte ok=0;
for(int i=0;i<8;i++){
Zakonceni[i]=Serial.read();}
 for(int ii=0;ii<8;ii++){
if((char)Zakonceni[ii]!=koneckom[ii])
{ ok=1;}}
if(ok==0){
OdpocetOdezvyPc=millis()+(Ostatni.Hlidani_Pc[1])*1000;
delay(25);
Serial.write("ARDUINOODEZVAREAKCEKONECKOM");
delay(75);
}else {delay(25);Serial.write("ARDUINOCHYBAKOMUNIKACKONECKOM");delay(75);}}

public:void Odezv2(){///////////////////////////////HLIDANI PC////////////////////////////////////////
if(Serial.available()==15){  
int KONTROLA[6];
int i=0;
for(i=0;i<6;i++){
KONTROLA[i]=(int)Serial.read();//NAHRANI PRICHOZI KOMUNIKACE DO KONTROLY
}
/////////////////// POROVNANI S PAMETI//////////
for(i=0;i<6;i++){
if(KONTROLA[i]!=Ostatni.Eeprom_Heslo[i]){//KONTROLA S heslem pro pristup k pameti
i=100;
}}
if(i==101){Serial.write("ARDUINOSPATNEHESLOKONECKOM");}
else if(i==6){
int ZMENANA=Serial.read();

int Zakonceni[8];
byte ok=0;
for(int i=0;i<8;i++){
Zakonceni[i]=Serial.read();}
 for(int ii=0;ii<8;ii++){
if((char)Zakonceni[ii]!=koneckom[ii])
{ ok=1;}}
if(ok==0){
if(ZMENANA==0){delay(25);
Ostatni.Hlidani_Pc[0]=ZMENANA;
EEPROM.write(802,ZMENANA);
Serial.write("ARDUINONEHLIDAMPORTKONECKOM");
delay(175);}else if(ZMENANA==1){delay(25);
Ostatni.Hlidani_Pc[0]=ZMENANA;
EEPROM.write(802,ZMENANA);
OdpocetOdezvyPc=millis()+(Ostatni.Hlidani_Pc[1])*1000;
Serial.write("ARDUINOHLIDAMPORTTTKONECKOM");
delay(175);}else {Ostatni.Hlidani_Pc[0]=1;delay(25);
Serial.write("ARDUINOHLIDAMPORTTTKONECKOM");delay(175);}
}else {delay(25);Serial.write("ARDUINOCHYBAKOMUNIKACKONECKOM");delay(175);}}
}}


public:void Okkkkk(){
Serial.write("spusteno Okkkkk");}

public:void Kdojsi(){
Serial.write("ARDUINO");
Serial.write(Jsem);
Serial.write("KONECKOM");
}

public:void Chybaa(){
Serial.write("spusteno Chybaa");}

public:void Zjisti(){
Serial.write("ARDUINOZJISTI");
for(int i=0;i<16;i++){
byte hodnota=(analogRead(i))/4;
Serial.write(hodnota);}
byte hodnota;
for(int i=0;i<52;i++){
  if(i!=11){
    if((Digital_Ovladani[i].Vystup_Nastaveni!=1)||(Digital_Ovladani[i].Vystup_Nastaveni!=2)){
pinMode(i+2,INPUT);
    hodnota=digitalRead(i+2);}
Serial.write(hodnota);}else {Serial.write(hodnota);}}
Serial.write("KONECKOM");
}};







Kontrola_Komunikace Kontrola_Komunikace;
void setup() {
    Serial.begin(115200);
      pinMode(13, OUTPUT); 
    ArduinoEeprom.Nahrej_Z_Pameti();
    ArduinoEeprom.kontrola2();
   Analog_Kontrola.Analog_Poprve_Zapnuto();
    Digit_Kontrola.Digit_Poprve_Zapnuto();
     Kontrola_Komunikace.Inicializuj();
                     
               for (int i = 0; i < 400; i++){
    if((i+3)%4==0){
           EEPROM.write(i, 0); }         }        
                     
     
   }
void loop() {
    Cas.Cas();
   Analog_Kontrola.Analog_Pin_Kontrola();
   Digit_Kontrola.Digit_Pin_Kontrola(); 
   Kontrola_Komunikace.Kontrola_Komunikace1();
   Kontrola_Komunikace.PcPoplach();}